package org.aileen.springbook.service;

import lombok.extern.slf4j.Slf4j;
import org.aileen.springbook.Mapper.BookMapper;
import org.aileen.springbook.enums.StatusEnum;
import org.aileen.springbook.model.BookInfo;
import org.aileen.springbook.model.PageResult;
import org.aileen.springbook.model.RequestPage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import java.util.List;
@Slf4j
@Service//将对象交给Spring管理
public class BookService {


    @Autowired
    private BookMapper bookMapper;



    /**
     * 添加图书
     * @param bookInfo
     * @return 返回添加的图书ID
     */
    public Integer addBook(BookInfo bookInfo) {
        //调用Mapper层的添加方法
        return bookMapper.insertBook(bookInfo);
    }

    /**
     * 获取图书列表
     * @return 返回图书列表
     */
    public PageResult<BookInfo> getListByPage(RequestPage requestPage) {


        //1.count,从数据库中获取可借阅图书的总条数
        Integer count = bookMapper.count();
        //2.计算分页的偏移量:即当前页是从第几条数据开始查询  = (当前页码 - 1) * 每页显示的条数
        //int offset = (requestPage.getCurrentPage() - 1) * requestPage.getPageSize();
        //3.从数据库中获取可借阅的图书列表
        List<BookInfo> bookInfos = bookMapper.getListByPage(requestPage.getoffset() , requestPage.getPageSize());

        //下面的代码是为了将查询结果中的状态码转换为中文描述,数据库中存储的状态码是1和2,分别表示可借阅和不可借阅,我们需要将其转换为中文描述
//        for (BookInfo bookInfo : bookInfos) {
//            if(bookInfo.getStatus() == 1){
//                bookInfo.setStateCN("可借阅");
//            }else{
//                bookInfo.setStateCN("不可借阅");
//            }
//        }
        //为了优化代码,我们可以将状态码状态的转换使用枚举类来进行转换,这样可以避免硬编码,使代码更加清晰和易于维护
        for(BookInfo bookInfo : bookInfos){
            //获取当前图书的状态码 -> bookInfo.getStatus();
            int code = bookInfo.getStatus();
            //使用枚举类进行状态码转换->将当前图书的状态码转换为中文描述
            bookInfo.setStateCN(StatusEnum.getNameByCode(code).getName());
        }
        //4.将查询结果封装到PageResult对象中 并将其返回  ,
//        PageResult<BookInfo> result = new PageResult<>();
//        result.setItems(bookInfos);
//        result.setCount(count);

        return new PageResult<>(bookInfos , count , requestPage);


        //上面比较繁杂,我们可以把计算分页偏移量的代码写到RequestPage中,通过RequestPage.getOffset()方法获取偏移量
        //简化2:我们可以通过在PageResult中添加全参构造和无参构造的注解,然后这里就可以不用通过对象来进行传参操作,而是直接将他们放到new的对象里面返回即可


    }

    public BookInfo getBookInfo(Integer bookId) {
        return bookMapper.getBookInfo(bookId);
    }

    public Integer updateBook(BookInfo bookInfo) {
        return bookMapper.updateBook(bookInfo);
    }


    public Integer batchDelete(List<Integer> ids) {
        return bookMapper.batchDelete(ids);
    }
}
